package com.test.discoverer;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

/**
 * 默认的参数名称发现器，实现了ParameterNameDiscoverer接口
 * 该类通过反射获取方法或构造器的参数名称，如果参数名称不可用，则使用默认名称
 */
public class DefaultParameterNameDiscoverer implements ParameterNameDiscoverer{
    /**
     * 获取方法的参数名称
     * 如果参数名称在编译时不可用，将使用默认名称（如arg0, arg1...）
     *
     * @param method 要获取参数名称的方法
     * @return 方法的参数名称数组
     */
    @Override
    public String[] getParameterNames(Method method) {
        // 获取方法的所有参数
        Parameter[] parameters = method.getParameters();
        // 创建一个数组来存储参数名称
        String[] parameterNames = new String[parameters.length];

        // 遍历方法的每个参数
        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            // 检查参数是否有编译时名称
            if (parameter.isNamePresent()){
                // 如果有名称，使用实际的参数名称
                parameterNames[i] = parameter.getName();
            }else {
                // 如果没有名称，使用默认参数名称
                parameterNames[i] = "arg" + i;
            }
        }
        // 返回参数名称数组
        return parameterNames;
    }

    /**
     * 获取构造器的参数名称
     * 如果参数名称在编译时不可用，将使用默认名称（如arg0, arg1...）
     *
     * @param ctor 要获取参数名称的构造器
     * @return 构造器的参数名称数组
     */
    @Override
    public String[] getParameterNames(Constructor<?> ctor) {
        // 获取构造器的所有参数
        Parameter[] parameters = ctor.getParameters();
        // 创建一个数组来存储参数名称
        String[] parameterNames = new String[parameters.length];
        // 遍历构造器的每个参数
        for (int i = 0; i < parameters.length; i++) {
            Parameter parameter = parameters[i];
            // 检查参数是否有编译时名称
            if (parameter.isNamePresent()){
                // 如果有名称，使用实际的参数名称
                parameterNames[i] = parameter.getName();
            }else {
                // 如果没有名称，使用默认参数名称
                parameterNames[i] = "arg" + i;
            }
        }
        // 返回参数名称数组
        return parameterNames;
    }
}
